import numpy as np

class DNAMutationAnalyzer:
    """
    基因突变检测器：通过参数敏感性分析量化损伤可能性
    技术原理：模态置信准则(MAC) + 频率偏移率
    刑侦比喻：对比嫌疑人DNA与犯罪数据库
    """

    def __init__(self, healthy_dna):
        """
        参数：
        healthy_dna : 健康结构的DNA字典（基准数据库）
        """
        self.base_freq = healthy_dna['frequencies']
        self.base_modes = healthy_dna['modes']

    def analyze(self, sample_dna):
        """
        执行DNA比对分析
        返回：
          mutation_score : 突变可能性评分（0~1）
          hotspot_index : 最敏感参数索引
        """
        # 频率偏移率（"年龄异常度"）
        freq_diff = self._calc_freq_deviation(sample_dna['frequencies'])

        # 振型相似度（"外貌相似度"）
        mac_scores = self._calc_mac(sample_dna['modes'])

        # 综合突变评分（公式见论文）
        mutation_score = 0.6 * freq_diff + 0.4 * (1 - mac_scores)

        return {
            'score': mutation_score,
            'hotspots': np.argsort(freq_diff)[-3:]  # 前3敏感参数
        }

    def _calc_freq_deviation(self, sample_freq):
        """计算归一化频率偏移率"""
        # 只使用 sample_freq 中与 self.base_freq 长度相同的部分
        sample_freq = sample_freq[:len(self.base_freq)]
        return np.mean(np.abs((np.array(self.base_freq) - np.array(sample_freq)) / np.array(self.base_freq)))

    def _calc_mac(self, sample_modes):
        """计算模态置信准则(MAC)"""
        # 简化的MAC计算（实际需矩阵运算）
        return np.mean([self._mac_single(m1, m2)
                        for m1, m2 in zip(self.base_modes, sample_modes)])

    def _mac_single(self, mode1, mode2):
        """单模态MAC值计算"""
        return np.abs(mode1.T @ mode2) ** 2 / ((mode1.T @ mode1) * (mode2.T @ mode2))